package ACWing.Dynamicprogramming;
//291. 蒙德里安的梦想（状态压缩dp优点难暂时未理解）
import java.util.Scanner;

/**
 * @author :chenjie
 * @date :Created 2022/11/24 15:22
 */
public class MondriansDream {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=1,m=1;
        while (n!=0&&m!=0){
            n=sc.nextInt();
            m=sc.nextInt();
            System.out.println(dp(n, m));
        }
    }
    public static int dp(int n,int m){
        int[][]dp=new int[m+1][n+1];//i表示列数（j用来表示状态表示i-1列凸出来的方法）
        boolean[]st=new boolean[m+1];
        for (int i = 0; i < 1<<n; i++) {
            st[i]=true;
            int cnt=0;
            for (int j = 0; j < n; j++) {
                if((i>>j&1)!=0){
                    if((cnt&1)!=0){
                        st[i]=false;
                        break;
                    }
                }else cnt++;
            }
            if((cnt&1)!=0){
                st[i]=false;
            }
        }
        dp[0][0]=1;
        for (int i = 1; i <= m ; i++) {
            for (int j = 0; j<1 << n; j++) {
                for (int k = 0; k < 1 << n; k++) {
                    if((j&k)==0&&st[j|k]){
                        dp[i][j]+=dp[i-1][k];
                    }
                }
            }
        }
        return dp[m][0];
    }

}
